package com.liangtian.mdm.system.log.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.liangtian.mdm.system.log.dao.SysLogDao;
import com.liangtian.mdm.system.log.model.SysLog;
import com.liangtian.mdm.system.log.service.SysLogService;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 日志接口实现
 * @author Qi
 */
@Service
public class SysLogServiceImpl implements SysLogService {

    @Autowired
    SysLogDao sysLogDao;

    /**
     * 新增日志
     * @param sysLog 日志对象
     * @return 受影响的行数
     */
    @Override
    public int insertLog(SysLog sysLog) {
        return sysLogDao.insertSelective(sysLog);
    }

    /**
     * 分页查询日志信息
     * @param sysLog 日志查询条件
     *   length 每页显示条数
     *   pageNum 页码
     *   start 起始条数
     *   draw 请求次数
     *   userName 用户姓名
     *   organizationName 机构名称
     *   operationType 操作类型
     *   beginDate 开始时间
     *   endDate 结束时间
     *  @return 分页信息数据
     */
    @Override
    public PageInfo selectLogPageByCondition(SysLog sysLog) {
        Integer pageNum = sysLog.getPageNum();
        Integer length = sysLog.getLength();
        PageHelper.startPage(pageNum, length);
        List<Map<String, Object>> logsMapList = sysLogDao.selectLogPageByCondition(sysLog);
        PageInfo<Map<String, Object>> pageInfo = new PageInfo<Map<String, Object>>(logsMapList);
        return pageInfo;
    }

    /**
     * @param sysLog
     * @return 导出成功失败
     * @desc 导出日志数据
     */
    @Override
    public int exportLogsData(SysLog sysLog) {
        List<Map<String, Object>> logsMapList = sysLogDao.selectLogPageByCondition(sysLog);
        // 第一步，创建一个webbook，对应一个Excel文件
        HSSFWorkbook wb = new HSSFWorkbook();
        // 第二步，在webbook中添加一个sheet,对应Excel文件中的sheet
        HSSFSheet sheet = wb.createSheet("工时审批数据");
        // 第三步，在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short
        HSSFRow row = sheet.createRow((int) 0);
        // 第四步，创建单元格，并设置值表头 设置表头居中
        HSSFCellStyle style = wb.createCellStyle();
        style.setAlignment(HorizontalAlignment.CENTER); // 创建一个居中格式
        style.setLocked(true);
        HSSFCell cell = row.createCell(0);
        cell.setCellValue("用户姓名");
        cell.setCellStyle(style);
        cell = row.createCell(1);
        cell.setCellValue("所属机构");
        cell.setCellStyle(style);
        cell = row.createCell(2);
        cell.setCellValue("操作时间");
        cell.setCellStyle(style);
        cell = row.createCell(3);
        cell.setCellValue("客户端信息");
        cell.setCellStyle(style);
        cell = row.createCell(4);
        cell.setCellValue("操作类型");
        cell.setCellStyle(style);
        cell = row.createCell(5);
        cell.setCellValue("操作内容");
        cell.setCellStyle(style);
        cell = row.createCell(6);
        cell.setCellValue("浏览器类型");
        cell.setCellStyle(style);
        for (int i = 0; i < logsMapList.size(); i++) {
            row = sheet.createRow((int) i + 1);
            // 第四步，创建单元格，并设置值
            row.createCell(0).setCellValue(logsMapList.get(i).get("userName") + "");
            row.createCell(1).setCellValue(logsMapList.get(i).get("organizationName") + "");
            row.createCell(2).setCellValue(logsMapList.get(i).get("operationDate") + "");
            cell = row.createCell(3);
            cell.setCellValue(logsMapList.get(i).get("ipAddress") + "");
            cell = row.createCell(4);
            if ("1".equals(logsMapList.get(i).get("operationType") + "")) {
                cell.setCellValue("登录");
            } else if ("2".equals(logsMapList.get(i).get("operationType") + "")) {
                cell.setCellValue("注销");
            } else if ("3".equals(logsMapList.get(i).get("operationType") + "")) {
                cell.setCellValue("新增");
            } else if ("4".equals(logsMapList.get(i).get("operationType") + "")) {
                cell.setCellValue("编辑");
            } else if ("5".equals(logsMapList.get(i).get("operationType") + "")) {
                cell.setCellValue("删除");
            } else if ("6".equals(logsMapList.get(i).get("operationType") + "")) {
                cell.setCellValue("上传");
            } else if ("7".equals(logsMapList.get(i).get("operationType") + "")) {
                cell.setCellValue("下载");
            } else {
                cell.setCellValue("其他");
            }
            row.createCell(5).setCellValue(logsMapList.get(i).get("operationContent") + "");
            row.createCell(6).setCellValue(logsMapList.get(i).get("browserType") + "");
        }
        // 第六步，将文件存到指定位置
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        String currentDate = sdf.format(new Date());
        String filePath = "C:/logs-" + currentDate + ".xls";
        try {
            FileOutputStream fout = new FileOutputStream(filePath);
            wb.write(fout);
            fout.close();
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
        return 1;
    }

    /**
     * @param sysLog 日志对象
     * @return 受影响的行数 1-成功 0-失败
     * @desc 新增日志
     */
    @Override
    public int insertSysLog(SysLog sysLog) {
        return sysLogDao.insertSelective(sysLog);
    }

    @Override
    public PageInfo getSysLogList(Map<String, Object> map) {
        PageInfo<List<SysLog>> pageInfo = null;
        try {
            Object pNo = map.get("pageNum");
            int pageNum, pageSize;
            // export
            if (pNo != null && !"NaN".equals(pNo)) {
                pageNum = Integer.parseInt(pNo.toString());// 页码
            } else {
                pageNum = 1;
            }
            // pageSize=0时不分页
            pageSize = Integer.parseInt(map.get("limit").toString());// 模型定义页面要显示数据条数
            // 例如
            // 10,20,50,100
            PageHelper.startPage(pageNum, pageSize);// 开始分页标志（当前页，显示条数）
            List<SysLog> list = sysLogDao.getSysLogList(map);
            pageInfo = new PageInfo(list);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return pageInfo;
    }
}
